//手写一个自己的迭代器函数
const obj = {
    data: ['a', 'b', 'c'],
    [Symbol.iterator]() {
        let index = 0; //索引定义在外面,形成闭包结构
        let that = this; //this指向迭代器对象
        return {
            next() {
                if (index < that.data.length) {
                    return {
                        value: that.data[index++],
                        done: false
                    }
                } else {
                    return {
                        value: undefined,
                        done: true
                    }
                }
            }
        }
    }
}

//验证
for (const x of obj) console.log(x); //for of 调用的是obj[Symbol.iterator]()


for (const x of ['a','b','c']) console.log(x); //可以发现数组自身就携带有迭代器

testObj={
    a:1,
    b:2,
    c:3,
}

// console.log(testObj[Symbol.iterator]); //undefined,说明数组自身就携带有迭代器,但是对象没有
// for (const x of testObj) console.log(x); //报错

console.log(testObj.__proto__ === Object.prototype);
testObj.__proto__[Symbol.iterator] = function*(){ //给对象的原型上添加迭代器,这样所有对象都可以使用这个迭代器
    for (const key in this) yield this[key];
}

for (const x of testObj) console.log(x);

//在创建一个对象,看看新对象的迭代器,新对象的迭代器是原型上的迭代器
const testObj2 ={
    a:11,
    b:22,
    c:33,
}

for (const x of testObj2) console.log(x);





